# -*- coding: utf-8 -*-
"""
推荐系统模块 - 数据模型
"""

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.conf import settings


class UserActivityView(models.Model):
    """
    用户浏览活动历史记录模型
    
    用于记录用户浏览活动的行为，为智能推荐系统提供数据支持
    """
    
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='activity_views',
        verbose_name='用户'
    )
    
    activity = models.ForeignKey(
        'activities.Activity',
        on_delete=models.CASCADE,
        related_name='user_views',
        verbose_name='活动'
    )
    
    # 浏览次数（同一用户多次浏览同一活动）
    view_count = models.IntegerField(
        default=1,
        verbose_name='浏览次数'
    )
    
    # 浏览时长（秒）
    duration = models.IntegerField(
        default=0,
        verbose_name='浏览时长',
        help_text='用户在该活动页面停留的时长（秒）'
    )
    
    # 浏览来源
    SOURCE_CHOICES = [
        ('search', '搜索'),
        ('recommend', '推荐'),
        ('hot', '热门'),
        ('category', '分类浏览'),
        ('user_profile', '用户主页'),
        ('share', '分享链接'),
        ('notification', '通知'),
        ('other', '其他'),
    ]
    
    source = models.CharField(
        max_length=20,
        choices=SOURCE_CHOICES,
        default='other',
        verbose_name='浏览来源',
        help_text='用户从哪里进入该活动页面'
    )
    
    # 是否有交互（评论、点赞、报名等）
    has_interaction = models.BooleanField(
        default=False,
        verbose_name='是否交互',
        help_text='是否对该活动进行了评论、点赞、报名等操作'
    )
    
    # 用户设备信息
    device_type = models.CharField(
        max_length=50,
        blank=True,
        verbose_name='设备类型',
        help_text='如：mobile, tablet, desktop'
    )
    
    # IP地址（可用于地理位置推荐）
    ip_address = models.GenericIPAddressField(
        null=True,
        blank=True,
        verbose_name='IP地址'
    )
    
    # 首次浏览时间
    first_viewed_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='首次浏览时间'
    )
    
    # 最后浏览时间
    last_viewed_at = models.DateTimeField(
        auto_now=True,
        verbose_name='最后浏览时间'
    )
    
    class Meta:
        db_table = 'user_activity_views'
        verbose_name = '用户浏览记录'
        verbose_name_plural = '用户浏览记录'
        unique_together = ('user', 'activity')
        ordering = ['-last_viewed_at']
        indexes = [
            models.Index(fields=['user', '-last_viewed_at']),
            models.Index(fields=['activity', '-last_viewed_at']),
            models.Index(fields=['user', 'has_interaction']),
        ]
    
    def __str__(self):
        return f"{self.user.username} 浏览了 {self.activity.title}"
    
    def increment_view(self, duration=0, source='other', device_type='', ip_address=None):
        """
        增加浏览次数
        
        Args:
            duration: 本次浏览时长
            source: 浏览来源
            device_type: 设备类型
            ip_address: IP地址
        """
        self.view_count += 1
        if duration > 0:
            self.duration += duration
        if source:
            self.source = source
        if device_type:
            self.device_type = device_type
        if ip_address:
            self.ip_address = ip_address
        self.save()


class UserInterestTag(models.Model):
    """
    用户兴趣标签模型
    
    基于用户行为自动生成和更新的兴趣标签，用于推荐算法
    """
    
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='interest_tags',
        verbose_name='用户'
    )
    
    # 标签名称（如：运动、读书、旅游）
    tag_name = models.CharField(
        max_length=50,
        verbose_name='标签名称'
    )
    
    # 标签权重（0-1之间，表示用户对该标签的兴趣程度）
    weight = models.FloatField(
        default=0.0,
        validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
        verbose_name='权重',
        help_text='0-1之间，数值越大表示兴趣越浓厚'
    )
    
    # 权重来源（浏览、报名、评论等行为的权重累加）
    from_views = models.FloatField(
        default=0.0,
        verbose_name='浏览贡献',
        help_text='从浏览行为中计算的权重'
    )
    
    from_registrations = models.FloatField(
        default=0.0,
        verbose_name='报名贡献',
        help_text='从报名行为中计算的权重'
    )
    
    from_comments = models.FloatField(
        default=0.0,
        verbose_name='评论贡献',
        help_text='从评论行为中计算的权重'
    )
    
    from_ratings = models.FloatField(
        default=0.0,
        verbose_name='评分贡献',
        help_text='从评分行为中计算的权重'
    )
    
    # 最后更新时间
    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name='更新时间'
    )
    
    class Meta:
        db_table = 'user_interest_tags'
        verbose_name = '用户兴趣标签'
        verbose_name_plural = '用户兴趣标签'
        unique_together = ('user', 'tag_name')
        ordering = ['-weight']
        indexes = [
            models.Index(fields=['user', '-weight']),
        ]
    
    def __str__(self):
        return f"{self.user.username} - {self.tag_name} ({self.weight:.2f})"
    
    def update_weight(self):
        """重新计算总权重"""
        self.weight = (
            self.from_views * 0.2 +
            self.from_registrations * 0.4 +
            self.from_comments * 0.2 +
            self.from_ratings * 0.2
        )
        # 确保权重在0-1之间
        self.weight = max(0.0, min(1.0, self.weight))
        self.save()
